package com.zzl.myblog.View.Fragment;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;

import com.google.android.material.tabs.TabLayout;
import com.zzl.myblog.R;
import com.zzl.myblog.Utils.FragmentFactoryUtil;
import com.zzl.myblog.View.Adapter.TabPagerAdapter;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;

/**
 *   "导向界面"和"项目界面"复用TagsFragment,之后用户切换viewpager跳到不同的fragment
 *   - TagsFragment.newInstance("leadFragment", username);
 *   - TagsFragment.newInstance("projectFragment", username);
 */
public class TagsFragment extends Fragment {
    static String username;

    View rootView;

    String TAG = "TagsFragment";

    String strFragmentKind; // 导向界面 or 项目界面[暂时未开发]

    private Unbinder unbinder;

    @BindView(R.id.tl_lead_fragment)
    TabLayout tabLayout;

    @BindView(R.id.vp_lead_fragment)
    ViewPager viewPager;

    private String[] titles;    // TabLayout 标题数组

    private List<Fragment> fragments;   // Fragments 数组


    /**
     * 空构造函数
     */
    public TagsFragment() {
        // Required empty public constructor
    }

    /**
     *  newInstance
     *  - 拿到 fragment
     *  - 配置 bundle : username fragmentKind
     *  - 返回 fragment
     */
    public static TagsFragment newInstance(String FragmentKind,String username) {
        TagsFragment fragment = new TagsFragment(); // 创建一个TagsFragment 实例

        Bundle bundle = new Bundle(); // 新建Bundle
        bundle.putString("username", username); // 用户名 username
        bundle.putString("fragmentKind", FragmentKind); // 传入的 FragmentKind

        fragment.setArguments(bundle); // bundle 和 TagsFragment 实例进行绑定

        return fragment; // 返回TagsFragment 实例对象
    }

    /**
     *  生命周期：onCreateView
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_lead, container, false); // 拿到父布局的rootView

        //返回一个Unbinder值（进行解绑），注意这里的this不能使用getActivity()
        unbinder = ButterKnife.bind(this, rootView);
        //获取fragmentKind类型值 判断是初始化何种碎片 使用断言判空
        assert getArguments() != null;
        strFragmentKind = getArguments().getString("fragmentKind"); // 获取 fragmentKind的Kind类型值
        username = getArguments().getString("username");//获取 username

        // 初始化TagsFragment
        initFragment();

        return rootView;    // 返回 TagsFragment 视图view
    }

    /**
     * 初始化TagsFragment
     * - 依据 strFragmentKind 来有选择的进行初始化
     */
    private void initFragment() {
        switch (strFragmentKind) {
            case "leadFragment":
                initLeadFragment(); // 先TabLayout，后ViewPager,最后进行绑定
                break;
            default:
                break;
        }
    }

    /**ViewPager
     * titles，fragments，viewpager初始完后与适配器绑定
     * 抛出异常，initProjectFragment需重用此方法（加载数据）
     */
    private void initView() throws NullPointerException {
        // getChildFragmentManager()解决滑动卡顿 亲测有效
        // 自定义实现的 tabPageAdapter
        TabPagerAdapter tabPagerAdapter = new TabPagerAdapter(getChildFragmentManager());
        tabPagerAdapter.setTitles(titles);
        tabPagerAdapter.setFragments(fragments);

        // viewPager 和 tabPagerAdapter 进行绑定
        viewPager.setAdapter(tabPagerAdapter);

        // TabLayout和 ViewPager绑定
        tabLayout.setupWithViewPager(viewPager);

        // 设置tabLayout允许滚动
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    }

    /** TabLayout
     * - 给tabLayout 添加两个Tab项
     * - titles
     * - 依据titles 创建两个 fragments [工具类FragmentFactoryUtil创建的Fragment是单例的，不会重复创建]
     */
    private void initLeadFragment() {
        // 给 tabLayout 增减 Tab 项
        tabLayout.addTab(tabLayout.newTab().setText("知识体系"));
        tabLayout.addTab(tabLayout.newTab().setText("拓维导航"));

        // titles 数组
        titles = new String[]{"知识体系", "拓维导航"};

        // fragments 数组
        fragments = new ArrayList<>();

        // 使用 FragmentFactoryUtil 工具类创建两个Fragment，分别用于知识体系与拓维导航
        for (int i = 0; i < titles.length; i++) {
            fragments.add(FragmentFactoryUtil.initFragment(i,username));
        }

        initView();
    }

    /**
     * onDestroyView中进行解绑操作
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
}
